29-4-2021

Aedes Benchmark

Jaarlijkse vergelijking van de maatschappelijke prestaties van van ca 300 corporaties over verschillende prestatievelden. Per prestatieveld o.b.v. een aantal bepalende variabelen een eindoordeel (A,B,C score). Dataset bevat historie over ca 7 jaar/300+ variabelen*.

Aedes Benchmark

  • Huurdersoordeel
  • Beinvloedbare bedrijfslasten
  • Onderhoud en Verbetering
  • Duurzaamheid
  • Beschikbaarheid en Betaalbaarheid, Leefbaarheid, Niewbouw*

Aedes Benchmark

Exploratie Dataset

  • Data Science technieken op de dataset toepassen (exploratief)
  • Vooraf geen duidelijke businescase en/of probleemstelling
  • Vooral toepassen en wellicht verrassen(?)
  • Uitwerking met focus op prestatieveld huurdersoordeel 2019

Git Repository: https://github.com/DekkerMartijn/AedesBenchmark

length(Df_Huurderoordeel_jaar$Corporatie)
## [1] 381
prop.table(table(Df_Huurderoordeel_jaar$Letter.huurdersoordeel..Letters..3.klasse..))
## 
##         A         B         C 
## 0.2242647 0.4963235 0.2794118

Huurdersoordeel

Huurdersoordeel

scatterplotMatrix(Model_Df[,c(2:4)])

Huurdersoordeel

plot_ly(Model_Df, x=~X_R, y=~X_NH, 
             z=~X_VH, color=~Y) %>%
  add_markers(size=1.5)

Cluster Analyse

Model_Df5$cluster = factor(kmeans(Model_Df5,3)$cluster)
levels(Model_Df5$cluster) <- c("A","B","C")

Cluster Analyse

##       fitted
## actual  A  B  C
##      A 58  2  1
##      B 59 42 34
##      C  0 52 24

Huurdersoordeel Tree Model

# Fit tree model
set.seed(100481)
Tree <- rpart(Y~., data=Model_Df)
rpart.plot(Tree, box.palette="RdBu", shadow.col="gray", nn=TRUE)

Tree Model

# Confusion Matrix
fit.val <- predict(Tree, type = "class")
table(actual = Model_Df$Y, fitted = fit.val)
##       fitted
## actual   A   B   C
##      A  56   5   0
##      B   0 134   1
##      C   0   8  68

Random Forest

rf <- randomForest(
  Y ~ .,
  data=Model_Df, importance=TRUE
)
rf
## 
## Call:
##  randomForest(formula = Y ~ ., data = Model_Df, importance = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 1
## 
##         OOB estimate of  error rate: 1.1%
## Confusion matrix:
##    A   B  C class.error
## A 59   2  0 0.032786885
## B  0 134  1 0.007407407
## C  0   0 76 0.000000000

Misclassified

indices <- vector(mode = "logical", length = length(Model_Df$Y))
for (i in 1:length(Model_Df$Y)) { if (Model_Df$Y[i] == rf$predicted[i]) 
    { indices[i] <- TRUE } 
      else indices[i] <- FALSE
}
Check_False <- Model_Df[which(!indices),]
Check_False$Predicted <- rf$predicted[which(!indices)]Check_False
##                 Y X_NH X_R X_VH Predicted
## Heuvelrug Wonen A  8.1 7.9  7.1         B
## Stadgenoot      B  7.6 7.1  8.0         C
## Wonen Delden    A  7.6 7.9  7.7         B

Fit met overige variabelen

rf2 <- randomForest(
  Y ~ .,
  data=Model_Df4, importance=TRUE
)rf2
## 
## Call:
##  randomForest(formula = Y ~ ., data = Model_Df4, importance = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 8
## 
##         OOB estimate of  error rate: 39.84%
## Confusion matrix:
##   A  B  C class.error
## A 0 16  2   1.0000000
## B 0 46 14   0.2333333
## C 0 17 28   0.3777778

Fit with different vars

varImpPlot(rf2, n.var = 10, type=1)

PCA

ca 33% verklaarde variantie in 3 principale componenenten over 108 variabelen*.

df.pca <- prcomp(Df2019, center = TRUE,scale. = TRUE) #scale en center
fviz_eig(df.pca)

PCA

PCA

PCA

Belangrijkste Bevindingen

  • Beoordelingskader
  • Inlvoed van overige kenmerken
  • Andere technieken?
  • Suggesties